Find out how the risktaking was set together and how they are measured

Each preference measure is standardized at the individual level, so that, by construction, each preference has a mean of zero and a standard deviation of one in the individual-level world sample.

Find out about the overlap

Concept: What do we want

#Load packages

library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.8 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********
library(tidyr)
library(haven)
library(ggplot2)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:data.table’:

    between, first, last

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
library(lmtest)
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric
library(maps)
library(mapdata)

#Add data GPS

gps_data <- haven::read_dta("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/GPS_dataset_individual_level/individual_new.dta")

head(country_data)

Number of courtries

# Determine the number of different countries
number_of_countries <- length(unique(gps_data$country))

# Display the number of different countries
number_of_countries
[1] 76

Clean the data from missing values

# Clean the data by removing records with missing values
cleaned_data <- gps_data %>%
  drop_na(country, isocode, risktaking, gender, age)

# Calculate the number of records removed per variable
records_removed_per_variable <- colSums(is.na(gps_data)) - colSums(is.na(cleaned_data))

# Display the cleaned data
cleaned_data

# Display the number of records removed per variable
records_removed_per_variable
         country          isocode             ison           region         language             date 
               0                0                0                0                0                0 
       id_gallup              wgt         patience       risktaking         posrecip         negrecip 
               0                0              190              634               32              247 
        altruism            trust subj_math_skills           gender              age 
              74              163              132                0              276 

List of all variable

# List all variables
variable_list <- names(cleaned_data) # OR colnames(your_data)

# Display the list of variables
print(variable_list)
 [1] "country"          "isocode"          "ison"             "region"           "language"        
 [6] "date"             "id_gallup"        "wgt"              "patience"         "risktaking"      
[11] "posrecip"         "negrecip"         "altruism"         "trust"            "subj_math_skills"
[16] "gender"           "age"             

#select only the variables of interest

cleaned_data <- cleaned_data %>%
  select(country, isocode, ison, date, risktaking, gender, age)
cleaned_data

Create a new column “age_group” with the age categories

cleaned_data$agecat <- cut(
  cleaned_data$age,
  breaks = c(15, 20, 30, 40, 50, 60, 70, 80, Inf), # The category boundaries
  labels = c("15-19", "20-29", "30-39", "40-49", "50-59", "60-69", "70-79", "80+"), # The category labels
  right = FALSE # Left end (inclusive), right end (exclusive)
)

# Display the new column
head(cleaned_data)

Descriptive

Number of courtries after data cleaning

# Determine the number of different countries
number_of_countries <- length(unique(cleaned_data$country))

# Display the number of different countries
number_of_countries
[1] 76

Worldmap of the recorded countries

world_map <- map_data("world") # Create a world map with country borders

recorded_countries <- unique(cleaned_data$country) # Get the list of recorded countries from your cleaned_data

world_map$recorded <- ifelse(world_map$region %in% recorded_countries, "Recorded", "Not Recorded") # Create a new variable indicating whether a country has been recorded or not

# Plot the world map with recorded countries highlighted
ggplot(world_map, aes(x = long, y = lat, group = group, fill = recorded)) +
  geom_polygon(color = "white") +
  scale_fill_manual(values = c("Recorded" = "darkblue", "Not Recorded" = "lightgrey"), guide = "legend") +
  theme_void() +
  labs(title = "Recorded Countries on World Map", fill = "Status") +
  theme(legend.position = "bottom")

All about the age

# Age Range
age_min <- min(cleaned_data$age, na.rm = TRUE)
age_max <- max(cleaned_data$age, na.rm = TRUE)

# Average Age
average_age <- mean(cleaned_data$age, na.rm = TRUE)

# Median Age
median_age <- median(cleaned_data$age, na.rm = TRUE)

# Display the age statistics
cat("Age Range: ", age_min, " to ", age_max, "\n")
Age Range:  15  to  99 
cat("Average Age: ", average_age, "\n")
Average Age:  41.73605 
cat("Median Age: ", median_age, "\n")
Median Age:  40 

Number of participants in each age category

# number of participants in each age category
agecat_counts <- table(cleaned_data$agecat)

# Display the number of participants in the age categories
print(agecat_counts)

15-19 20-29 30-39 40-49 50-59 60-69 70-79   80+ 
 6888 16872 15905 13583 11374  8570  4688  1559 

Boxplot of Age Distribution per Country

ggplot(cleaned_data, aes(x = age)) +
  geom_histogram(binwidth = 0.5, fill = "lightblue", color = "blue") +
  labs(x = "Age", y = "Frequency", title = "Histogram of Age Distributionn") +
  theme_minimal()


ggplot(cleaned_data, aes(x = country, y = age)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Distribution of Age per Country", x = "Country", y = "Age") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

All about the gender

# Calculate the counts of females (gender = 1) and males (gender = 2)
gender_counts <- table(cleaned_data$gender)

# Display the counts
cat("Number of Females: ", gender_counts[1], "\n")
Number of Females:  36024 
cat("Number of Males: ", gender_counts[2], "\n")
Number of Males:  43415 

Table with country and gender

# Create a table that breaks down the number of participants by country and gender
gender_by_country <- xtabs(~ country + gender, data = cleaned_data)

# Rename columns and rows for better readability
colnames(gender_by_country) <- c("Female", "Male")
rownames(gender_by_country) <- unique(cleaned_data$country)

# Calculate the total participants by summing the rows
total_participants <- rowSums(gender_by_country)

# Create a data frame with country, total participants, female, and male
result_table <- data.frame(
  country = rownames(gender_by_country),
  total_participants = total_participants,
  female = gender_by_country[, "Female"],
  male = gender_by_country[, "Male"]
)

# Display the result table
result_table

Analysis of item risktaking

# Summary statistics for risktaking
risk_summary <- summary(cleaned_data$risktaking)

# Histogram of risktaking
ggplot(cleaned_data, aes(x = risktaking)) +
  geom_histogram(binwidth = 1, fill = "lightblue", color = "blue", alpha = 0.7) +
  labs(title = "Distribution of Risk-Taking", x = "Risk-Taking Score", y = "Frequency") +
  theme_minimal()


# Boxplot of risktaking by gender
ggplot(cleaned_data, aes(x = as.factor(gender), y = risktaking, fill = as.factor(gender))) +
  geom_boxplot() +
  labs(title = "Risk-Taking by Gender", x = "Gender", y = "Risk-Taking Score") +
  scale_x_discrete(labels = c("0" = "male", "1" = "female")) +
  theme_minimal() +
  guides(fill = FALSE)


# Risk vs age
ggplot(cleaned_data, aes(risktaking, age)) +
  geom_point(size = 0.2) +  
  geom_smooth(method = "lm")


# Boxplot of risktaking by age group
cleaned_data$age_group <- cut(cleaned_data$age, breaks = c(0, 25, 35, 45, 55, Inf),
                               labels = c("18-25", "26-35", "36-45", "46-55", "56+"))
ggplot(cleaned_data, aes(x = age_group, y = risktaking, fill = age_group)) +
  geom_boxplot() +
  labs(title = "Risk-Taking by Age Group", x = "Age Group", y = "Risk-Taking Score") +
  theme_minimal() +
  guides(fill = FALSE)


# Boxplot of risktaking by country
ggplot(cleaned_data, aes(x = country, y = risktaking)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Risk-Taking by Country", x = "Country", y = "Risk-Taking Score") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

# Fit das Modell mit "age"
model_gender <- lm(risktaking ~ age, data = cleaned_data)

# Intercept and Slope for age
intercept_age <- coef(model)["(Intercept)"]
slope_age <- coef(model)["age"]

summary(model)

Call:
lm(formula = risktaking ~ age, data = cleaned_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.24386 -0.68385 -0.04386  0.65311  3.05477 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.5759701  0.0089312   64.49   <2e-16 ***
age         -0.0137902  0.0001974  -69.84   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9707 on 79437 degrees of freedom
Multiple R-squared:  0.05786,   Adjusted R-squared:  0.05784 
F-statistic:  4878 on 1 and 79437 DF,  p-value: < 2.2e-16
# Fit das Modell mit "gender"
model_gender <- lm(risktaking ~ gender, data = cleaned_data)

# Intercept und Slope für gender
intercept_gender <- coef(model_gender)["(Intercept)"]
slope_gender <- coef(model_gender)["gender"]

summary(model_gender)

Call:
lm(formula = risktaking ~ gender, data = cleaned_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9994 -0.7148 -0.0128  0.6792  2.5688 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.124666   0.005235   23.81   <2e-16 ***
gender      -0.227338   0.007081  -32.10   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9936 on 79437 degrees of freedom
Multiple R-squared:  0.01281,   Adjusted R-squared:  0.0128 
F-statistic:  1031 on 1 and 79437 DF,  p-value: < 2.2e-16

Create a table with the following information: country, isocode, n (count of participants), female percentage (%), mean age, age range, and risktaking

# Group the data by country
table_data <- gps_data %>%
  group_by(country, isocode) %>%
  summarize(
    n = n(),
    female_percentage = mean(gender == 1) * 100,
    mean_age = mean(age, na.rm = TRUE),
    age_range = paste(min(age, na.rm = TRUE), "-", max(age, na.rm = TRUE)),
    mean_risktaking = mean(risktaking, na.rm = TRUE)
  )
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
# Intercept and slope for age
intercept_age <- 0.5759701
slope_age <- -0.0137902

# Intercept and slope for gender
intercept_gender <- 0.124666 
slope_gender <- -0.227338 

# Add the intercept and slope information to the table
table_data <- table_data %>%
  mutate(
    intercept_age = intercept_age,
    slope_age = slope_age,
    intercept_gender = intercept_gender,
    slope_gender = slope_gender,
  )

# Display the updated table
table_data
NA

checking the assumptions in a linear regression

# Scatterplot to check for linearity
ggplot(cleaned_data, aes(x = age, y = risktaking)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "blue") +
  labs(title = "Scatterplot for Linearity Check")

# Residual vs. Fitted plot to check for homoskedasticity
model <- lm(risktaking ~ age, data = cleaned_data)
ggplot() +
  geom_point(aes(x = fitted(model), y = residuals(model))) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Residuals vs. Fitted Values for Homoskedasticity Check")

# Q-Q plot to check for normality of residuals
qqnorm(residuals(model))
qqline(residuals(model))

# Correlation matrix to check for multicollinearity
cor(cleaned_data[c("age", "risktaking")])
                  age risktaking
age         1.0000000 -0.2405333
risktaking -0.2405333  1.0000000
# Durbin-Watson test for autocorrelation
dwtest(model)

    Durbin-Watson test

data:  model
DW = 1.5415, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
# Residual vs. Leverage plot to check for outliers
ggplot() +
  geom_point(aes(x = hatvalues(model), y = residuals(model))) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Residuals vs. Leverage for Outlier Check")

#Preparing for linear regression

# Check for missing values in 'Country' and 'Risktaking' columns
missing_country <- anyNA(cleaned_data$country)
missing_risktaking <- anyNA(cleaned_data$risktaking)

# Print the results
cat("Missing values in 'Country': ", missing_country, "\n")
Missing values in 'Country':  FALSE 
cat("Missing values in 'Risktaking': ", missing_risktaking, "\n")
Missing values in 'Risktaking':  FALSE 
# Clean the data by removing records with missing values
cleaned_data <- gps_data %>%
  drop_na(country, risktaking, age)

# Split the data by country and perform linear regression for each country
regression_results <- cleaned_data %>%
  group_by(country) %>%
  do(model = lm(risktaking ~ age, data = .)) %>%
  summarize(
    country = first(country),
    intercept = summary(model)$coefficients[1],
    slope = summary(model)$coefficients[2],
    r_squared = summary(model)$r.squared
  )

# Display regression results for each country
print(regression_results)

analyze the results by using “Balkendiagramm

what does 0 mean? // centered age = mean age of the sample
ggplot(data = regression_results, aes(x = country, y = intercept)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Intercepts for Risktaking by Country", x = "Country", y = "Intercept Value") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

View the countries with intercept values over 0.75

high_intercept_countries <- subset(regression_results, intercept > 0.75)

# View the countries with intercept values over 0.75
print(high_intercept_countries)

Scatterplots for ‘high_intercept_countries’ contains the top 17 countries

# Create scatterplots with regression lines for countries with intercept > 0.75 and smaller points
plots <- lapply(1:nrow(regression_results), function(i) {
  country <- regression_results$country[i]
  intercept <- regression_results$intercept[i]
  
  if (intercept > 0.75) {
    p <- ggplot(subset(cleaned_data, country == country), aes(x = age, y = risktaking)) +
      geom_point(size = 0.5) +  # Set the size to a smaller value (e.g., 2)
      geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "blue") +
      labs(title = paste("Linear Regression for", country),
           subtitle = paste("Intercept:", round(intercept, 2)))
    print(p)
  }
})


# Save the plots in a directory
dir.create("individual_country_plots", showWarnings = FALSE)
setwd("individual_country_plots")
Warning: The working directory was changed to /Users/laurabazzigher/Documents/GitHub/risk_wvs/code/individual_country_plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
for (i in seq_along(plots)) {
  filename <- paste0("plot_", i, ".png")
  ggsave(filename, plot = plots[[i]], width = 8, height = 6)
}


# Switch back to the original working directory
setwd("..")

print("Individual plots for countries with intercept > 0.75 and smaller points are saved in the 'individual_country_plots' directory.")
[1] "Individual plots for countries with intercept > 0.75 and smaller points are saved in the 'individual_country_plots' directory."

Create scatterplots with regression lines for individual countries

# Examples for countries
regression_results <- data.frame(
  country = c("Algeria", "Argentina", "Austria"),
  intercept = c(0.92053422, 0.51698822, 0.42606684),
  slope = c(-0.0146641801, -0.0115569623, -0.0108763042),
  r_squared = c(5.232529e-02, 5.638271e-02, 3.539810e-02    )
)

# Create scatterplots with regression lines for each country
plots <- lapply(seq_len(nrow(regression_results)), function(i) {
  country <- regression_results$country[i]
  intercept <- regression_results$intercept[i]
  slope <- regression_results$slope[i]
  r_squared <- regression_results$r_squared[i]
  
  p <- ggplot(subset(cleaned_data, country == country), aes(x = age, y = risktaking)) +
    geom_point() +
    geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "blue") +
    labs(title = paste("Linear Regression for", country),
         subtitle = paste("Intercept:", round(intercept, 2),
                           "Slope:", round(slope, 2),
                           "R-squared:", round(r_squared, 2)))
  print(p)
})


# Save the plots in a directory
dir.create("individual_country_plots", showWarnings = FALSE)
setwd("individual_country_plots")
Warning: The working directory was changed to /Users/laurabazzigher/Documents/GitHub/risk_wvs/code/individual_country_plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
for (i in seq_along(plots)) {
  filename <- paste0("plot_", i, ".png")
  ggsave(filename, plot = plots[[i]], width = 8, height = 6)
}


# Switch back to the original working directory
setwd("..")

print("Individual plots are saved in the 'individual_country_plots' directory.")
[1] "Individual plots are saved in the 'individual_country_plots' directory."

Create a scatterplot with separate regression lines for each country

ggplot(cleaned_data, aes(x = age, y = risktaking, color = country)) +
  geom_point(size = 0.2) +                           # Adjust point size
  geom_smooth(method = "lm", se = FALSE, size = 0.5, linetype = "solid") + # Adjust line size and type
  labs(title = "Scatterplot with Regression Lines for risktaking and age by Country", 
       x = "Age", y = "Risktaking") +
  theme(legend.position = "bottom",              # Move the legend below the graph
        legend.key.size = unit(0.1, "in"))      # Adjust the size of the legend key
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.

Scatterplot with include both individual country regression lines and an overall regression line

# Calculate the overall regression line
overall_lm <- lm(risktaking ~ age, data = cleaned_data)

# Create a scatterplot with separate regression lines for each country
# and an overall regression line
ggplot(cleaned_data, aes(x = age, y = risktaking, color = country)) +
  geom_point(size = 0.5) +                      # Adjust point size
  geom_smooth(method = "lm", se = FALSE, size = 0.5) + # Solid line for individual countries
  geom_abline(intercept = coef(overall_lm)[1], slope = coef(overall_lm)[2], 
              color = "black", size = 1) + # Add the overall regression line in red
  labs(title = "Scatterplot with Regression Lines for risktaking and age by Country", 
       x = "Age", y = "Risktaking") +
  theme(legend.position = "bottom",          # Move the legend below the graph
        legend.key.size = unit(0.1, "in"))  # Adjust the size of the legend key

Combined List of all 3 files

Prepare Wave 5

# Load the data
WV5_data <- readRDS("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/F00007944-WV5_Data_R_v20180912.rds") # Data of Wave 5

#rename the variables
WV5_data <- WV5_data_df %>%
  rename(sex = V235, age = V237, country = V2, wave = V1, risktaking = V86)
WV5_data

#select only the variables of interest
WV5_data <- WV5_data %>%
  select(sex, age, country, wave, risktaking)
WV5_data

#decode the country names 
countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV5_data$country_lab = countrynames$name [match(WV5_data$country, countrynames$code)]
table(WV5_data$country_lab)

            Andorra           Argentina           Australia              Brazil            Bulgaria 
               1003                1002                1421                1500                1001 
       Burkina Faso              Canada               Chile               China            Colombia 
               1534                2164                1000                1991                3025 
         Cyprus (G)               Egypt            Ethiopia             Finland              France 
               1050                3051                1500                1014                1001 
            Georgia             Germany               Ghana       Great Britain           Guatemala 
               1500                2064                1534                1041                1000 
          Hong Kong             Hungary               India           Indonesia                Iran 
               1252                1007                2001                2015                2667 
               Iraq               Italy               Japan              Jordan            Malaysia 
               2701                1012                1096                1200                1201 
               Mali              Mexico             Moldova             Morocco         Netherlands 
               1534                1560                1046                1200                1050 
        New Zealand              Norway                Peru              Poland             Romania 
                954                1025                1500                1000                1776 
             Russia              Rwanda            Slovenia        South Africa         South Korea 
               2033                1507                1037                2988                1200 
              Spain              Sweden         Switzerland              Taiwan            Thailand 
               1200                1003                1241                1227                1534 
Trinidad and Tobago              Turkey             Ukraine       United States             Uruguay 
               1002                1346                1000                1249                1000 
           Viet Nam              Zambia 
               1495                1500 
WV5_data

Prepare Wave 6

WV6_data <- load("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)

#rename variables in Wave 6

WV6_data <- WV6_data %>%
  rename(wave = V1, sex = V240, age = V242,country = V2, risktaking = V76)

#select only the variables of interest
WV6_data <- WV6_data %>%
  select(wave, sex, age, country, sex,risktaking)
WV6_data

#decode daraset (Wave 6)

countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country_lab = countrynames$name [match(WV6_data$country, countrynames$code)]
table(WV6_data$country_lab)

            Algeria           Argentina             Armenia           Australia          Azerbaijan 
               1200                1030                1100                1477                1002 
            Belarus              Brazil               Chile               China            Colombia 
               1535                1486                1000                2300                1512 
         Cyprus (G)             Ecuador               Egypt             Estonia             Georgia 
               1000                1202                1523                1533                1202 
            Germany               Ghana               Haiti           Hong Kong               India 
               2046                1552                1996                1000                4078 
               Iraq               Japan              Jordan          Kazakhstan              Kuwait 
               1200                2443                1200                1500                1303 
         Kyrgyzstan             Lebanon               Libya            Malaysia              Mexico 
               1500                1200                2131                1300                2000 
            Morocco         Netherlands         New Zealand             Nigeria            Pakistan 
               1200                1902                 841                1759                1200 
          Palestine                Peru         Philippines              Poland               Qatar 
               1000                1210                1200                 966                1060 
            Romania              Russia              Rwanda           Singapore            Slovenia 
               1503                2500                1527                1972                1069 
       South Africa         South Korea               Spain              Sweden              Taiwan 
               3531                1200                1189                1206                1238 
           Thailand Trinidad and Tobago             Tunisia              Turkey             Ukraine 
               1200                 999                1205                1605                1500 
      United States             Uruguay          Uzbekistan               Yemen            Zimbabwe 
               2232                1000                1500                1000                1500 
WV6_data

Prepare GPS dataset (cleaned_data)

print(colnames(cleaned_data))
 [1] "country_lab"      "isocode"          "ison"             "region"           "language"        
 [6] "date"             "id_gallup"        "wgt"              "patience"         "risktaking"      
[11] "posrecip"         "negrecip"         "altruism"         "trust"            "subj_math_skills"
[16] "gender"           "age"             
cleaned_data <- cleaned_data %>%
  mutate(country_lab = country) %>%
  select(-country)
Error in `select()`:
! Can't subset columns that don't exist.
✖ Column `Zimbabwe` doesn't exist.
Backtrace:
 1. cleaned_data %>% mutate(country_lab = country) %>% ...
 3. dplyr:::select.data.frame(., -country)

#combine the 3 dataset (Wave 6 + Wave 5 + gps)

combined_data <- rbind(WV5_data, WV6_data, cleaned_data)
Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match
# extract the countries in each file 
country_WV5 <- unique(WV5_data$country)
country_WV6 <- unique(WV6_data$country)
country_gps <- unique(cleaned_data$country)

# find common countries
common_country <- Reduce(intersect, list(country_WV5, country_WV6, country_gps))

# Print the common countries
print(common_country)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBGaW5kIG91dCBob3cgdGhlIHJpc2t0YWtpbmcgd2FzIHNldCB0b2dldGhlciBhbmQgaG93IHRoZXkgYXJlIG1lYXN1cmVkCkVhY2ggcHJlZmVyZW5jZSBtZWFzdXJlIGlzIHN0YW5kYXJkaXplZCBhdCB0aGUgaW5kaXZpZHVhbCBsZXZlbCwgc28gdGhhdCwgYnkgY29uc3RydWN0aW9uLCBlYWNoIHByZWZlcmVuY2UgaGFzIGEgbWVhbiBvZiB6ZXJvIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvbmUgaW4gdGhlIGluZGl2aWR1YWwtbGV2ZWwgd29ybGQgc2FtcGxlLgoKIyBGaW5kIG91dCBhYm91dCB0aGUgb3ZlcmxhcAotIHNhbWUgY291bnRyaWVzIAotIGZhY2lkIHdyYXAgLS0+IFBsb3QgYnkgY291bnRyeQotIHNjYXR0ZXJwbG90cyAtLT4gbWVhbiBjb3VudHJ5IC8vIG1lYW4gcmlzayAKCiMgQ29uY2VwdDogV2hhdCBkbyB3ZSB3YW50IAotIFJpc2t0YWtpbmcgYW5kIGFnZSBzbG9wZQotIFBsb3QgaXQgYnkgaG93IHN0ZWVwIHRoZSBzbG9wZSBpcwotLT4gUnVuIGl0IGluIGFuIG1peGVkIGVmZmVjdCBtb2RlbCAoc2VlIHBhcGVyIGZyb20gUnVpKQoKI0xvYWQgcGFja2FnZXMgCmBgYHtyfQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkobWFwZGF0YSkKYGBgCgojQWRkIGRhdGEgR1BTCmBgYHtyfQpncHNfZGF0YSA8LSBoYXZlbjo6cmVhZF9kdGEoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9HUFNfZGF0YXNldF9pbmRpdmlkdWFsX2xldmVsL2luZGl2aWR1YWxfbmV3LmR0YSIpCgpoZWFkKGNvdW50cnlfZGF0YSkKYGBgCiMgTnVtYmVyIG9mIGNvdXJ0cmllcyAKYGBge3J9CiMgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNvdW50cmllcwpudW1iZXJfb2ZfY291bnRyaWVzIDwtIGxlbmd0aCh1bmlxdWUoZ3BzX2RhdGEkY291bnRyeSkpCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRyaWVzCm51bWJlcl9vZl9jb3VudHJpZXMKYGBgCgojIENsZWFuIHRoZSBkYXRhIGZyb20gbWlzc2luZyB2YWx1ZXMKYGBge3J9CiMgQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgcmVjb3JkcyB3aXRoIG1pc3NpbmcgdmFsdWVzCmNsZWFuZWRfZGF0YSA8LSBncHNfZGF0YSAlPiUKICBkcm9wX25hKGNvdW50cnksIGlzb2NvZGUsIHJpc2t0YWtpbmcsIGdlbmRlciwgYWdlKQoKIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbW92ZWQgcGVyIHZhcmlhYmxlCnJlY29yZHNfcmVtb3ZlZF9wZXJfdmFyaWFibGUgPC0gY29sU3Vtcyhpcy5uYShncHNfZGF0YSkpIC0gY29sU3Vtcyhpcy5uYShjbGVhbmVkX2RhdGEpKQoKIyBEaXNwbGF5IHRoZSBjbGVhbmVkIGRhdGEKY2xlYW5lZF9kYXRhCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbW92ZWQgcGVyIHZhcmlhYmxlCnJlY29yZHNfcmVtb3ZlZF9wZXJfdmFyaWFibGUKYGBgCgojIExpc3Qgb2YgYWxsIHZhcmlhYmxlCmBgYHtyfQojIExpc3QgYWxsIHZhcmlhYmxlcwp2YXJpYWJsZV9saXN0IDwtIG5hbWVzKGNsZWFuZWRfZGF0YSkgIyBPUiBjb2xuYW1lcyh5b3VyX2RhdGEpCgojIERpc3BsYXkgdGhlIGxpc3Qgb2YgdmFyaWFibGVzCnByaW50KHZhcmlhYmxlX2xpc3QpCmBgYAojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApgYGB7cn0KY2xlYW5lZF9kYXRhIDwtIGNsZWFuZWRfZGF0YSAlPiUKICBzZWxlY3QoY291bnRyeSwgaXNvY29kZSwgaXNvbiwgZGF0ZSwgcmlza3Rha2luZywgZ2VuZGVyLCBhZ2UpCmNsZWFuZWRfZGF0YQpgYGAKCiMgQ3JlYXRlIGEgbmV3IGNvbHVtbiAiYWdlX2dyb3VwIiB3aXRoIHRoZSBhZ2UgY2F0ZWdvcmllcwpgYGB7cn0KY2xlYW5lZF9kYXRhJGFnZWNhdCA8LSBjdXQoCiAgY2xlYW5lZF9kYXRhJGFnZSwKICBicmVha3MgPSBjKDE1LCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgSW5mKSwgIyBUaGUgY2F0ZWdvcnkgYm91bmRhcmllcwogIGxhYmVscyA9IGMoIjE1LTE5IiwgIjIwLTI5IiwgIjMwLTM5IiwgIjQwLTQ5IiwgIjUwLTU5IiwgIjYwLTY5IiwgIjcwLTc5IiwgIjgwKyIpLCAjIFRoZSBjYXRlZ29yeSBsYWJlbHMKICByaWdodCA9IEZBTFNFICMgTGVmdCBlbmQgKGluY2x1c2l2ZSksIHJpZ2h0IGVuZCAoZXhjbHVzaXZlKQopCgojIERpc3BsYXkgdGhlIG5ldyBjb2x1bW4KaGVhZChjbGVhbmVkX2RhdGEpCmBgYAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgRGVzY3JpcHRpdmUgCgojIE51bWJlciBvZiBjb3VydHJpZXMgYWZ0ZXIgZGF0YSBjbGVhbmluZwpgYGB7cn0KIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRyaWVzCm51bWJlcl9vZl9jb3VudHJpZXMgPC0gbGVuZ3RoKHVuaXF1ZShjbGVhbmVkX2RhdGEkY291bnRyeSkpCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRyaWVzCm51bWJlcl9vZl9jb3VudHJpZXMKYGBgCgoKIyBXb3JsZG1hcCBvZiB0aGUgcmVjb3JkZWQgY291bnRyaWVzCmBgYHtyfQp3b3JsZF9tYXAgPC0gbWFwX2RhdGEoIndvcmxkIikgIyBDcmVhdGUgYSB3b3JsZCBtYXAgd2l0aCBjb3VudHJ5IGJvcmRlcnMKCnJlY29yZGVkX2NvdW50cmllcyA8LSB1bmlxdWUoY2xlYW5lZF9kYXRhJGNvdW50cnkpICMgR2V0IHRoZSBsaXN0IG9mIHJlY29yZGVkIGNvdW50cmllcyBmcm9tIHlvdXIgY2xlYW5lZF9kYXRhCgp3b3JsZF9tYXAkcmVjb3JkZWQgPC0gaWZlbHNlKHdvcmxkX21hcCRyZWdpb24gJWluJSByZWNvcmRlZF9jb3VudHJpZXMsICJSZWNvcmRlZCIsICJOb3QgUmVjb3JkZWQiKSAjIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjb3VudHJ5IGhhcyBiZWVuIHJlY29yZGVkIG9yIG5vdAoKIyBQbG90IHRoZSB3b3JsZCBtYXAgd2l0aCByZWNvcmRlZCBjb3VudHJpZXMgaGlnaGxpZ2h0ZWQKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gcmVjb3JkZWQpKSArCiAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlJlY29yZGVkIiA9ICJkYXJrYmx1ZSIsICJOb3QgUmVjb3JkZWQiID0gImxpZ2h0Z3JleSIpLCBndWlkZSA9ICJsZWdlbmQiKSArCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKHRpdGxlID0gIlJlY29yZGVkIENvdW50cmllcyBvbiBXb3JsZCBNYXAiLCBmaWxsID0gIlN0YXR1cyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgojIEFsbCBhYm91dCB0aGUgYWdlCmBgYHtyfQojIEFnZSBSYW5nZQphZ2VfbWluIDwtIG1pbihjbGVhbmVkX2RhdGEkYWdlLCBuYS5ybSA9IFRSVUUpCmFnZV9tYXggPC0gbWF4KGNsZWFuZWRfZGF0YSRhZ2UsIG5hLnJtID0gVFJVRSkKCiMgQXZlcmFnZSBBZ2UKYXZlcmFnZV9hZ2UgPC0gbWVhbihjbGVhbmVkX2RhdGEkYWdlLCBuYS5ybSA9IFRSVUUpCgojIE1lZGlhbiBBZ2UKbWVkaWFuX2FnZSA8LSBtZWRpYW4oY2xlYW5lZF9kYXRhJGFnZSwgbmEucm0gPSBUUlVFKQoKIyBEaXNwbGF5IHRoZSBhZ2Ugc3RhdGlzdGljcwpjYXQoIkFnZSBSYW5nZTogIiwgYWdlX21pbiwgIiB0byAiLCBhZ2VfbWF4LCAiXG4iKQpjYXQoIkF2ZXJhZ2UgQWdlOiAiLCBhdmVyYWdlX2FnZSwgIlxuIikKY2F0KCJNZWRpYW4gQWdlOiAiLCBtZWRpYW5fYWdlLCAiXG4iKQpgYGAKCiMgTnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiBlYWNoIGFnZSBjYXRlZ29yeQpgYGB7cn0KIyBudW1iZXIgb2YgcGFydGljaXBhbnRzIGluIGVhY2ggYWdlIGNhdGVnb3J5CmFnZWNhdF9jb3VudHMgPC0gdGFibGUoY2xlYW5lZF9kYXRhJGFnZWNhdCkKCiMgRGlzcGxheSB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiB0aGUgYWdlIGNhdGVnb3JpZXMKcHJpbnQoYWdlY2F0X2NvdW50cykKYGBgCgojIEJveHBsb3Qgb2YgQWdlIERpc3RyaWJ1dGlvbiBwZXIgQ291bnRyeSAKYGBge3J9CmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gYWdlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh4ID0gIkFnZSIsIHkgPSAiRnJlcXVlbmN5IiwgdGl0bGUgPSAiSGlzdG9ncmFtIG9mIEFnZSBEaXN0cmlidXRpb25uIikgKwogIHRoZW1lX21pbmltYWwoKQoKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBjb3VudHJ5LCB5ID0gYWdlKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQWdlIHBlciBDb3VudHJ5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJBZ2UiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmBgYAoKIyBBbGwgYWJvdXQgdGhlIGdlbmRlcgpgYGB7cn0KIyBDYWxjdWxhdGUgdGhlIGNvdW50cyBvZiBmZW1hbGVzIChnZW5kZXIgPSAxKSBhbmQgbWFsZXMgKGdlbmRlciA9IDIpCmdlbmRlcl9jb3VudHMgPC0gdGFibGUoY2xlYW5lZF9kYXRhJGdlbmRlcikKCiMgRGlzcGxheSB0aGUgY291bnRzCmNhdCgiTnVtYmVyIG9mIEZlbWFsZXM6ICIsIGdlbmRlcl9jb3VudHNbMV0sICJcbiIpCmNhdCgiTnVtYmVyIG9mIE1hbGVzOiAiLCBnZW5kZXJfY291bnRzWzJdLCAiXG4iKQpgYGAKCiMgVGFibGUgd2l0aCBjb3VudHJ5IGFuZCBnZW5kZXIKYGBge3J9CiMgQ3JlYXRlIGEgdGFibGUgdGhhdCBicmVha3MgZG93biB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBieSBjb3VudHJ5IGFuZCBnZW5kZXIKZ2VuZGVyX2J5X2NvdW50cnkgPC0geHRhYnMofiBjb3VudHJ5ICsgZ2VuZGVyLCBkYXRhID0gY2xlYW5lZF9kYXRhKQoKIyBSZW5hbWUgY29sdW1ucyBhbmQgcm93cyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CmNvbG5hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSA8LSBjKCJGZW1hbGUiLCAiTWFsZSIpCnJvd25hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSA8LSB1bmlxdWUoY2xlYW5lZF9kYXRhJGNvdW50cnkpCgojIENhbGN1bGF0ZSB0aGUgdG90YWwgcGFydGljaXBhbnRzIGJ5IHN1bW1pbmcgdGhlIHJvd3MKdG90YWxfcGFydGljaXBhbnRzIDwtIHJvd1N1bXMoZ2VuZGVyX2J5X2NvdW50cnkpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCBjb3VudHJ5LCB0b3RhbCBwYXJ0aWNpcGFudHMsIGZlbWFsZSwgYW5kIG1hbGUKcmVzdWx0X3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgY291bnRyeSA9IHJvd25hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSwKICB0b3RhbF9wYXJ0aWNpcGFudHMgPSB0b3RhbF9wYXJ0aWNpcGFudHMsCiAgZmVtYWxlID0gZ2VuZGVyX2J5X2NvdW50cnlbLCAiRmVtYWxlIl0sCiAgbWFsZSA9IGdlbmRlcl9ieV9jb3VudHJ5WywgIk1hbGUiXQopCgojIERpc3BsYXkgdGhlIHJlc3VsdCB0YWJsZQpyZXN1bHRfdGFibGUKYGBgCiMgQW5hbHlzaXMgb2YgaXRlbSByaXNrdGFraW5nIApgYGB7cn0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHJpc2t0YWtpbmcKcmlza19zdW1tYXJ5IDwtIHN1bW1hcnkoY2xlYW5lZF9kYXRhJHJpc2t0YWtpbmcpCgojIEhpc3RvZ3JhbSBvZiByaXNrdGFraW5nCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gcmlza3Rha2luZykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUmlzay1UYWtpbmciLCB4ID0gIlJpc2stVGFraW5nIFNjb3JlIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIEJveHBsb3Qgb2Ygcmlza3Rha2luZyBieSBnZW5kZXIKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBhcy5mYWN0b3IoZ2VuZGVyKSwgeSA9IHJpc2t0YWtpbmcsIGZpbGwgPSBhcy5mYWN0b3IoZ2VuZGVyKSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBHZW5kZXIiLCB4ID0gIkdlbmRlciIsIHkgPSAiUmlzay1UYWtpbmcgU2NvcmUiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIwIiA9ICJtYWxlIiwgIjEiID0gImZlbWFsZSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKQoKIyBSaXNrIHZzIGFnZQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMocmlza3Rha2luZywgYWdlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuMikgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCiMgQm94cGxvdCBvZiByaXNrdGFraW5nIGJ5IGFnZSBncm91cApjbGVhbmVkX2RhdGEkYWdlX2dyb3VwIDwtIGN1dChjbGVhbmVkX2RhdGEkYWdlLCBicmVha3MgPSBjKDAsIDI1LCAzNSwgNDUsIDU1LCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTgtMjUiLCAiMjYtMzUiLCAiMzYtNDUiLCAiNDYtNTUiLCAiNTYrIikpCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gcmlza3Rha2luZywgZmlsbCA9IGFnZV9ncm91cCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBBZ2UgR3JvdXAiLCB4ID0gIkFnZSBHcm91cCIsIHkgPSAiUmlzay1UYWtpbmcgU2NvcmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKQoKIyBCb3hwbG90IG9mIHJpc2t0YWtpbmcgYnkgY291bnRyeQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGNvdW50cnksIHkgPSByaXNrdGFraW5nKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBDb3VudHJ5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJSaXNrLVRha2luZyBTY29yZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KIyBGaXQgZGFzIE1vZGVsbCBtaXQgImFnZSIKbW9kZWxfZ2VuZGVyIDwtIGxtKHJpc2t0YWtpbmcgfiBhZ2UsIGRhdGEgPSBjbGVhbmVkX2RhdGEpCgojIEludGVyY2VwdCBhbmQgU2xvcGUgZm9yIGFnZQppbnRlcmNlcHRfYWdlIDwtIGNvZWYobW9kZWwpWyIoSW50ZXJjZXB0KSJdCnNsb3BlX2FnZSA8LSBjb2VmKG1vZGVsKVsiYWdlIl0KCnN1bW1hcnkobW9kZWwpCmBgYApgYGB7cn0KIyBGaXQgZGFzIE1vZGVsbCBtaXQgImdlbmRlciIKbW9kZWxfZ2VuZGVyIDwtIGxtKHJpc2t0YWtpbmcgfiBnZW5kZXIsIGRhdGEgPSBjbGVhbmVkX2RhdGEpCgojIEludGVyY2VwdCB1bmQgU2xvcGUgZsO8ciBnZW5kZXIKaW50ZXJjZXB0X2dlbmRlciA8LSBjb2VmKG1vZGVsX2dlbmRlcilbIihJbnRlcmNlcHQpIl0Kc2xvcGVfZ2VuZGVyIDwtIGNvZWYobW9kZWxfZ2VuZGVyKVsiZ2VuZGVyIl0KCnN1bW1hcnkobW9kZWxfZ2VuZGVyKQpgYGAKCgojIENyZWF0ZSBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogY291bnRyeSwgaXNvY29kZSwgbiAoY291bnQgb2YgcGFydGljaXBhbnRzKSwgZmVtYWxlIHBlcmNlbnRhZ2UgKCUpLCBtZWFuIGFnZSwgYWdlIHJhbmdlLCBhbmQgcmlza3Rha2luZwpgYGB7cn0KIyBHcm91cCB0aGUgZGF0YSBieSBjb3VudHJ5CnRhYmxlX2RhdGEgPC0gZ3BzX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgaXNvY29kZSkgJT4lCiAgc3VtbWFyaXplKAogICAgbiA9IG4oKSwKICAgIGZlbWFsZV9wZXJjZW50YWdlID0gbWVhbihnZW5kZXIgPT0gMSkgKiAxMDAsCiAgICBtZWFuX2FnZSA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgYWdlX3JhbmdlID0gcGFzdGUobWluKGFnZSwgbmEucm0gPSBUUlVFKSwgIi0iLCBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpKSwKICAgIG1lYW5fcmlza3Rha2luZyA9IG1lYW4ocmlza3Rha2luZywgbmEucm0gPSBUUlVFKQogICkKCiMgSW50ZXJjZXB0IGFuZCBzbG9wZSBmb3IgYWdlCmludGVyY2VwdF9hZ2UgPC0gMC41NzU5NzAxCnNsb3BlX2FnZSA8LSAtMC4wMTM3OTAyCgojIEludGVyY2VwdCBhbmQgc2xvcGUgZm9yIGdlbmRlcgppbnRlcmNlcHRfZ2VuZGVyIDwtIDAuMTI0NjY2IApzbG9wZV9nZW5kZXIgPC0gLTAuMjI3MzM4IAoKIyBBZGQgdGhlIGludGVyY2VwdCBhbmQgc2xvcGUgaW5mb3JtYXRpb24gdG8gdGhlIHRhYmxlCnRhYmxlX2RhdGEgPC0gdGFibGVfZGF0YSAlPiUKICBtdXRhdGUoCiAgICBpbnRlcmNlcHRfYWdlID0gaW50ZXJjZXB0X2FnZSwKICAgIHNsb3BlX2FnZSA9IHNsb3BlX2FnZSwKICAgIGludGVyY2VwdF9nZW5kZXIgPSBpbnRlcmNlcHRfZ2VuZGVyLAogICAgc2xvcGVfZ2VuZGVyID0gc2xvcGVfZ2VuZGVyLAogICkKCiMgRGlzcGxheSB0aGUgdXBkYXRlZCB0YWJsZQp0YWJsZV9kYXRhCgpgYGAKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGNoZWNraW5nIHRoZSBhc3N1bXB0aW9ucyBpbiBhIGxpbmVhciByZWdyZXNzaW9uICAKYGBge3J9CiMgU2NhdHRlcnBsb3QgdG8gY2hlY2sgZm9yIGxpbmVhcml0eQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGFnZSwgeSA9IHJpc2t0YWtpbmcpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3QgZm9yIExpbmVhcml0eSBDaGVjayIpCmBgYApgYGB7cn0KIyBSZXNpZHVhbCB2cy4gRml0dGVkIHBsb3QgdG8gY2hlY2sgZm9yIGhvbW9za2VkYXN0aWNpdHkKbW9kZWwgPC0gbG0ocmlza3Rha2luZyB+IGFnZSwgZGF0YSA9IGNsZWFuZWRfZGF0YSkKZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBmaXR0ZWQobW9kZWwpLCB5ID0gcmVzaWR1YWxzKG1vZGVsKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArCiAgbGFicyh0aXRsZSA9ICJSZXNpZHVhbHMgdnMuIEZpdHRlZCBWYWx1ZXMgZm9yIEhvbW9za2VkYXN0aWNpdHkgQ2hlY2siKQpgYGAKCmBgYHtyfQojIFEtUSBwbG90IHRvIGNoZWNrIGZvciBub3JtYWxpdHkgb2YgcmVzaWR1YWxzCnFxbm9ybShyZXNpZHVhbHMobW9kZWwpKQpxcWxpbmUocmVzaWR1YWxzKG1vZGVsKSkKYGBgCgpgYGB7cn0KIyBDb3JyZWxhdGlvbiBtYXRyaXggdG8gY2hlY2sgZm9yIG11bHRpY29sbGluZWFyaXR5CmNvcihjbGVhbmVkX2RhdGFbYygiYWdlIiwgInJpc2t0YWtpbmciKV0pCmBgYAoKYGBge3J9CiMgRHVyYmluLVdhdHNvbiB0ZXN0IGZvciBhdXRvY29ycmVsYXRpb24KZHd0ZXN0KG1vZGVsKQpgYGAKCmBgYHtyfQojIFJlc2lkdWFsIHZzLiBMZXZlcmFnZSBwbG90IHRvIGNoZWNrIGZvciBvdXRsaWVycwpnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGhhdHZhbHVlcyhtb2RlbCksIHkgPSByZXNpZHVhbHMobW9kZWwpKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsKICBsYWJzKHRpdGxlID0gIlJlc2lkdWFscyB2cy4gTGV2ZXJhZ2UgZm9yIE91dGxpZXIgQ2hlY2siKQpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCgojUHJlcGFyaW5nIGZvciBsaW5lYXIgcmVncmVzc2lvbgpgYGB7cn0KIyBDaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMgaW4gJ0NvdW50cnknIGFuZCAnUmlza3Rha2luZycgY29sdW1ucwptaXNzaW5nX2NvdW50cnkgPC0gYW55TkEoY2xlYW5lZF9kYXRhJGNvdW50cnkpCm1pc3Npbmdfcmlza3Rha2luZyA8LSBhbnlOQShjbGVhbmVkX2RhdGEkcmlza3Rha2luZykKCiMgUHJpbnQgdGhlIHJlc3VsdHMKY2F0KCJNaXNzaW5nIHZhbHVlcyBpbiAnQ291bnRyeSc6ICIsIG1pc3NpbmdfY291bnRyeSwgIlxuIikKY2F0KCJNaXNzaW5nIHZhbHVlcyBpbiAnUmlza3Rha2luZyc6ICIsIG1pc3Npbmdfcmlza3Rha2luZywgIlxuIikKCmBgYAoKCmBgYHtyfQojIENsZWFuIHRoZSBkYXRhIGJ5IHJlbW92aW5nIHJlY29yZHMgd2l0aCBtaXNzaW5nIHZhbHVlcwpjbGVhbmVkX2RhdGEgPC0gZ3BzX2RhdGEgJT4lCiAgZHJvcF9uYShjb3VudHJ5LCByaXNrdGFraW5nLCBhZ2UpCgojIFNwbGl0IHRoZSBkYXRhIGJ5IGNvdW50cnkgYW5kIHBlcmZvcm0gbGluZWFyIHJlZ3Jlc3Npb24gZm9yIGVhY2ggY291bnRyeQpyZWdyZXNzaW9uX3Jlc3VsdHMgPC0gY2xlYW5lZF9kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIGRvKG1vZGVsID0gbG0ocmlza3Rha2luZyB+IGFnZSwgZGF0YSA9IC4pKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudHJ5ID0gZmlyc3QoY291bnRyeSksCiAgICBpbnRlcmNlcHQgPSBzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHNbMV0sCiAgICBzbG9wZSA9IHN1bW1hcnkobW9kZWwpJGNvZWZmaWNpZW50c1syXSwKICAgIHJfc3F1YXJlZCA9IHN1bW1hcnkobW9kZWwpJHIuc3F1YXJlZAogICkKCiMgRGlzcGxheSByZWdyZXNzaW9uIHJlc3VsdHMgZm9yIGVhY2ggY291bnRyeQpwcmludChyZWdyZXNzaW9uX3Jlc3VsdHMpCmBgYAoKCiMgYW5hbHl6ZSB0aGUgcmVzdWx0cyBieSB1c2luZyAiQmFsa2VuZGlhZ3JhbW0KIyMjIyMjIHdoYXQgZG9lcyAwIG1lYW4/IC8vIGNlbnRlcmVkIGFnZSA9IG1lYW4gYWdlIG9mIHRoZSBzYW1wbGUKYGBge3J9CmdncGxvdChkYXRhID0gcmVncmVzc2lvbl9yZXN1bHRzLCBhZXMoeCA9IGNvdW50cnksIHkgPSBpbnRlcmNlcHQpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIpICsKICBsYWJzKHRpdGxlID0gIkludGVyY2VwdHMgZm9yIFJpc2t0YWtpbmcgYnkgQ291bnRyeSIsIHggPSAiQ291bnRyeSIsIHkgPSAiSW50ZXJjZXB0IFZhbHVlIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAojIFZpZXcgdGhlIGNvdW50cmllcyB3aXRoIGludGVyY2VwdCB2YWx1ZXMgb3ZlciAwLjc1CmBgYHtyfQpoaWdoX2ludGVyY2VwdF9jb3VudHJpZXMgPC0gc3Vic2V0KHJlZ3Jlc3Npb25fcmVzdWx0cywgaW50ZXJjZXB0ID4gMC43NSkKCiMgVmlldyB0aGUgY291bnRyaWVzIHdpdGggaW50ZXJjZXB0IHZhbHVlcyBvdmVyIDAuNzUKcHJpbnQoaGlnaF9pbnRlcmNlcHRfY291bnRyaWVzKQpgYGAKCgojIFNjYXR0ZXJwbG90cyBmb3IgJ2hpZ2hfaW50ZXJjZXB0X2NvdW50cmllcycgY29udGFpbnMgdGhlIHRvcCAxNyBjb3VudHJpZXMKYGBge3J9CiMgQ3JlYXRlIHNjYXR0ZXJwbG90cyB3aXRoIHJlZ3Jlc3Npb24gbGluZXMgZm9yIGNvdW50cmllcyB3aXRoIGludGVyY2VwdCA+IDAuNzUgYW5kIHNtYWxsZXIgcG9pbnRzCnBsb3RzIDwtIGxhcHBseSgxOm5yb3cocmVncmVzc2lvbl9yZXN1bHRzKSwgZnVuY3Rpb24oaSkgewogIGNvdW50cnkgPC0gcmVncmVzc2lvbl9yZXN1bHRzJGNvdW50cnlbaV0KICBpbnRlcmNlcHQgPC0gcmVncmVzc2lvbl9yZXN1bHRzJGludGVyY2VwdFtpXQogIAogIGlmIChpbnRlcmNlcHQgPiAwLjc1KSB7CiAgICBwIDwtIGdncGxvdChzdWJzZXQoY2xlYW5lZF9kYXRhLCBjb3VudHJ5ID09IGNvdW50cnkpLCBhZXMoeCA9IGFnZSwgeSA9IHJpc2t0YWtpbmcpKSArCiAgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkgKyAgIyBTZXQgdGhlIHNpemUgdG8gYSBzbWFsbGVyIHZhbHVlIChlLmcuLCAyKQogICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UsIGNvbG9yID0gImJsdWUiKSArCiAgICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiTGluZWFyIFJlZ3Jlc3Npb24gZm9yIiwgY291bnRyeSksCiAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiSW50ZXJjZXB0OiIsIHJvdW5kKGludGVyY2VwdCwgMikpKQogICAgcHJpbnQocCkKICB9Cn0pCgojIFNhdmUgdGhlIHBsb3RzIGluIGEgZGlyZWN0b3J5CmRpci5jcmVhdGUoImluZGl2aWR1YWxfY291bnRyeV9wbG90cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQpzZXR3ZCgiaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzIikKCmZvciAoaSBpbiBzZXFfYWxvbmcocGxvdHMpKSB7CiAgZmlsZW5hbWUgPC0gcGFzdGUwKCJwbG90XyIsIGksICIucG5nIikKICBnZ3NhdmUoZmlsZW5hbWUsIHBsb3QgPSBwbG90c1tbaV1dLCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCn0KCiMgU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCIuLiIpCgpwcmludCgiSW5kaXZpZHVhbCBwbG90cyBmb3IgY291bnRyaWVzIHdpdGggaW50ZXJjZXB0ID4gMC43NSBhbmQgc21hbGxlciBwb2ludHMgYXJlIHNhdmVkIGluIHRoZSAnaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzJyBkaXJlY3RvcnkuIikKYGBgCgojIENyZWF0ZSBzY2F0dGVycGxvdHMgd2l0aCByZWdyZXNzaW9uIGxpbmVzIGZvciBpbmRpdmlkdWFsIGNvdW50cmllcwpgYGB7cn0KIyBFeGFtcGxlcyBmb3IgY291bnRyaWVzCnJlZ3Jlc3Npb25fcmVzdWx0cyA8LSBkYXRhLmZyYW1lKAogIGNvdW50cnkgPSBjKCJBbGdlcmlhIiwgIkFyZ2VudGluYSIsICJBdXN0cmlhIiksCiAgaW50ZXJjZXB0ID0gYygwLjkyMDUzNDIyLCAwLjUxNjk4ODIyLCAwLjQyNjA2Njg0KSwKICBzbG9wZSA9IGMoLTAuMDE0NjY0MTgwMSwgLTAuMDExNTU2OTYyMywgLTAuMDEwODc2MzA0MiksCiAgcl9zcXVhcmVkID0gYyg1LjIzMjUyOWUtMDIsIDUuNjM4MjcxZS0wMiwgMy41Mzk4MTBlLTAyCSkKKQoKIyBDcmVhdGUgc2NhdHRlcnBsb3RzIHdpdGggcmVncmVzc2lvbiBsaW5lcyBmb3IgZWFjaCBjb3VudHJ5CnBsb3RzIDwtIGxhcHBseShzZXFfbGVuKG5yb3cocmVncmVzc2lvbl9yZXN1bHRzKSksIGZ1bmN0aW9uKGkpIHsKICBjb3VudHJ5IDwtIHJlZ3Jlc3Npb25fcmVzdWx0cyRjb3VudHJ5W2ldCiAgaW50ZXJjZXB0IDwtIHJlZ3Jlc3Npb25fcmVzdWx0cyRpbnRlcmNlcHRbaV0KICBzbG9wZSA8LSByZWdyZXNzaW9uX3Jlc3VsdHMkc2xvcGVbaV0KICByX3NxdWFyZWQgPC0gcmVncmVzc2lvbl9yZXN1bHRzJHJfc3F1YXJlZFtpXQogIAogIHAgPC0gZ2dwbG90KHN1YnNldChjbGVhbmVkX2RhdGEsIGNvdW50cnkgPT0gY291bnRyeSksIGFlcyh4ID0gYWdlLCB5ID0gcmlza3Rha2luZykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UsIGNvbG9yID0gImJsdWUiKSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUoIkxpbmVhciBSZWdyZXNzaW9uIGZvciIsIGNvdW50cnkpLAogICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJJbnRlcmNlcHQ6Iiwgcm91bmQoaW50ZXJjZXB0LCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsb3BlOiIsIHJvdW5kKHNsb3BlLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlItc3F1YXJlZDoiLCByb3VuZChyX3NxdWFyZWQsIDIpKSkKICBwcmludChwKQp9KQoKIyBTYXZlIHRoZSBwbG90cyBpbiBhIGRpcmVjdG9yeQpkaXIuY3JlYXRlKCJpbmRpdmlkdWFsX2NvdW50cnlfcGxvdHMiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKc2V0d2QoImluZGl2aWR1YWxfY291bnRyeV9wbG90cyIpCgpmb3IgKGkgaW4gc2VxX2Fsb25nKHBsb3RzKSkgewogIGZpbGVuYW1lIDwtIHBhc3RlMCgicGxvdF8iLCBpLCAiLnBuZyIpCiAgZ2dzYXZlKGZpbGVuYW1lLCBwbG90ID0gcGxvdHNbW2ldXSwgd2lkdGggPSA4LCBoZWlnaHQgPSA2KQp9CgojIFN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeQpzZXR3ZCgiLi4iKQoKcHJpbnQoIkluZGl2aWR1YWwgcGxvdHMgYXJlIHNhdmVkIGluIHRoZSAnaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzJyBkaXJlY3RvcnkuIikKYGBgCgojIENyZWF0ZSBhIHNjYXR0ZXJwbG90IHdpdGggc2VwYXJhdGUgcmVncmVzc2lvbiBsaW5lcyBmb3IgZWFjaCBjb3VudHJ5CmBgYHtyfQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGFnZSwgeSA9IHJpc2t0YWtpbmcsIGNvbG9yID0gY291bnRyeSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAwLjIpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFkanVzdCBwb2ludCBzaXplCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSArICMgQWRqdXN0IGxpbmUgc2l6ZSBhbmQgdHlwZQogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgd2l0aCBSZWdyZXNzaW9uIExpbmVzIGZvciByaXNrdGFraW5nIGFuZCBhZ2UgYnkgQ291bnRyeSIsIAogICAgICAgeCA9ICJBZ2UiLCB5ID0gIlJpc2t0YWtpbmciKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsICAgICAgICAgICAgICAjIE1vdmUgdGhlIGxlZ2VuZCBiZWxvdyB0aGUgZ3JhcGgKICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMSwgImluIikpICAgICAgIyBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKYGBgCgojIFNjYXR0ZXJwbG90IHdpdGggaW5jbHVkZSBib3RoIGluZGl2aWR1YWwgY291bnRyeSByZWdyZXNzaW9uIGxpbmVzIGFuZCBhbiBvdmVyYWxsIHJlZ3Jlc3Npb24gbGluZQpgYGB7cn0KIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgcmVncmVzc2lvbiBsaW5lCm92ZXJhbGxfbG0gPC0gbG0ocmlza3Rha2luZyB+IGFnZSwgZGF0YSA9IGNsZWFuZWRfZGF0YSkKCiMgQ3JlYXRlIGEgc2NhdHRlcnBsb3Qgd2l0aCBzZXBhcmF0ZSByZWdyZXNzaW9uIGxpbmVzIGZvciBlYWNoIGNvdW50cnkKIyBhbmQgYW4gb3ZlcmFsbCByZWdyZXNzaW9uIGxpbmUKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBhZ2UsIHkgPSByaXNrdGFraW5nLCBjb2xvciA9IGNvdW50cnkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSArICAgICAgICAgICAgICAgICAgICAgICMgQWRqdXN0IHBvaW50IHNpemUKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBzaXplID0gMC41KSArICMgU29saWQgbGluZSBmb3IgaW5kaXZpZHVhbCBjb3VudHJpZXMKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBjb2VmKG92ZXJhbGxfbG0pWzFdLCBzbG9wZSA9IGNvZWYob3ZlcmFsbF9sbSlbMl0sIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsgIyBBZGQgdGhlIG92ZXJhbGwgcmVncmVzc2lvbiBsaW5lIGluIHJlZAogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgd2l0aCBSZWdyZXNzaW9uIExpbmVzIGZvciByaXNrdGFraW5nIGFuZCBhZ2UgYnkgQ291bnRyeSIsIAogICAgICAgeCA9ICJBZ2UiLCB5ID0gIlJpc2t0YWtpbmciKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsICAgICAgICAgICMgTW92ZSB0aGUgbGVnZW5kIGJlbG93IHRoZSBncmFwaAogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4xLCAiaW4iKSkgICMgQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBsZWdlbmQga2V5CmBgYAoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvbWJpbmVkIExpc3Qgb2YgYWxsIDMgZmlsZXMKCiMgUHJlcGFyZSBXYXZlIDUKYGBge3J9CiMgTG9hZCB0aGUgZGF0YQpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpICMgRGF0YSBvZiBXYXZlIDUKCiNyZW5hbWUgdGhlIHZhcmlhYmxlcwpXVjVfZGF0YSA8LSBXVjVfZGF0YV9kZiAlPiUKICByZW5hbWUoc2V4ID0gVjIzNSwgYWdlID0gVjIzNywgY291bnRyeSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYpCldWNV9kYXRhCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApXVjVfZGF0YSA8LSBXVjVfZGF0YSAlPiUKICBzZWxlY3Qoc2V4LCBhZ2UsIGNvdW50cnksIHdhdmUsIHJpc2t0YWtpbmcpCldWNV9kYXRhCgojZGVjb2RlIHRoZSBjb3VudHJ5IG5hbWVzIApjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L1dWNl9kYXRhc2V0X3dhdmVfNV82L2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNV9kYXRhJGNvdW50cnlfbGFiID0gY291bnRyeW5hbWVzJG5hbWUgW21hdGNoKFdWNV9kYXRhJGNvdW50cnksIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y1X2RhdGEkY291bnRyeV9sYWIpCldWNV9kYXRhCmBgYAoKIyBQcmVwYXJlIFdhdmUgNgpgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQpXVjZfZGF0YSA8LSBsb2FkKCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvV1Y2X0RhdGFfUl92MjAyMDExMTcucmRhdGEiKSAKV1Y2X2RhdGEgPC0gV1Y2X0RhdGFfUl92MjAyMDExMTcgCnByaW50KFdWNl9kYXRhKQpgYGAKCiNyZW5hbWUgdmFyaWFibGVzIGluIFdhdmUgNgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgc2V4ID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5ID0gVjIsIHJpc2t0YWtpbmcgPSBWNzYpCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApXVjZfZGF0YSA8LSBXVjZfZGF0YSAlPiUKICBzZWxlY3Qod2F2ZSwgc2V4LCBhZ2UsIGNvdW50cnksIHNleCxyaXNrdGFraW5nKQpXVjZfZGF0YQpgYGAKI2RlY29kZSBkYXJhc2V0IChXYXZlIDYpCmBgYHtyfQpjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2xhdXJhYmF6emlnaGVyL0RvY3VtZW50cy9HaXRIdWIvcmlza193dnMvZGF0YS9kYXRhc2V0L1dWNl9kYXRhc2V0X3dhdmVfNV82L2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNl9kYXRhJGNvdW50cnlfbGFiID0gY291bnRyeW5hbWVzJG5hbWUgW21hdGNoKFdWNl9kYXRhJGNvdW50cnksIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeV9sYWIpCldWNl9kYXRhCmBgYAojIFByZXBhcmUgR1BTIGRhdGFzZXQgKGNsZWFuZWRfZGF0YSkKYGBge3J9CiMgUmVuYW1lICJDb3VudHJ5IiBpbiAiY291bnRyeV9sYWIiCnByaW50KGNvbG5hbWVzKGNsZWFuZWRfZGF0YSkpCgpgYGAKYGBge3J9CmNsZWFuZWRfZGF0YSA8LSBjbGVhbmVkX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnlfbGFiID0gY291bnRyeSkgJT4lCiAgc2VsZWN0KC1jb3VudHJ5KQpgYGAKCiNjb21iaW5lIHRoZSAzIGRhdGFzZXQgKFdhdmUgNiArIFdhdmUgNSArIGdwcykKYGBge3J9CmNvbWJpbmVkX2RhdGEgPC0gcmJpbmQoV1Y1X2RhdGEsIFdWNl9kYXRhLCBjbGVhbmVkX2RhdGEpCgojbnVtYmVyIG9mIGNvdW50cmllcwoKbGVuZ3RoKHVuaXF1ZShjb21iaW5lZF9kYXRhJGNvdW50cnlfbGFiKSkKYGBgCmBgYHtyfQojIGV4dHJhY3QgdGhlIGNvdW50cmllcyBpbiBlYWNoIGZpbGUgCmNvdW50cnlfV1Y1IDwtIHVuaXF1ZShXVjVfZGF0YSRjb3VudHJ5KQpjb3VudHJ5X1dWNiA8LSB1bmlxdWUoV1Y2X2RhdGEkY291bnRyeSkKY291bnRyeV9ncHMgPC0gdW5pcXVlKGNsZWFuZWRfZGF0YSRjb3VudHJ5KQoKIyBmaW5kIGNvbW1vbiBjb3VudHJpZXMKY29tbW9uX2NvdW50cnkgPC0gUmVkdWNlKGludGVyc2VjdCwgbGlzdChjb3VudHJ5X1dWNSwgY291bnRyeV9XVjYsIGNvdW50cnlfZ3BzKSkKCiMgUHJpbnQgdGhlIGNvbW1vbiBjb3VudHJpZXMKcHJpbnQoY29tbW9uX2NvdW50cnkpCmBgYAoK